package com.yenroc.ho.多线程;

import java.util.Date;
import java.util.concurrent.*;

/**
 * 线程池
 */
public class MyThread04 {

    public static void main(String[] args) {
        // 创建线程池:创建这些线程池的方法都被封装到Executors这个类中
        // 固定大小的线程池
        ExecutorService executors = Executors.newFixedThreadPool(3);
        // 动态线程池 ExecutorService executors = Executors.newCachedThreadPool();
//        ExecutorService executors = new ThreadPoolExecutor(4,64,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

        // 反复执行的线程池（定时执行，线程池不要shutdown）
        ScheduledExecutorService  sExecutors = Executors.newScheduledThreadPool(2);
        // 延迟1s后只执行一次
        sExecutors.schedule(new MyTaskThread(),1, TimeUnit.SECONDS);

        // 延迟2秒后开始执行定时任务，每3秒执行(当上一个线程执行完成才会继续下一个执行，如果线程执行5s结束，那么则每次执行间隔是5s)
        sExecutors.scheduleAtFixedRate(new MyTaskThread(),2, 3, TimeUnit.SECONDS);

        // 2秒后开始执行定时任务，以3秒为间隔执行:(当上一个线程执行完成才会继续下一个执行,如果线程执行5s结束，则需要再间隔3s，5+3s后执行)
        sExecutors.scheduleWithFixedDelay(new MyTaskThread(),2, 3, TimeUnit.SECONDS);

        for (int i = 0; i < 10; i++) {
            Thread t = new MyTaskThread();
            executors.submit(t);
        }
        System.out.println("main Thread end.. ");
        // 关闭线程池:
        executors.shutdown();
    }
}

class MyTaskThread extends Thread {
    @Override
    public void run() {
        System.out.printf("线程[%s]\t 当前时间=[%s] \n",Thread.currentThread().getName(), new Date());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

